package com.ruoyi.abuwxapi;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.abuwx.domain.AbucoderWxuser;
import com.ruoyi.abuwx.service.IAbucoderWxappConfigService;
import com.ruoyi.abuwx.service.IAbucoderWxuserService;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.WxLoginBody;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.WxUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.framework.web.service.SysLoginService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/wxapi/")
public class WxLoginController {

    /**
     * 测试接口
     * @return
     */
    @GetMapping("test")
    public AjaxResult test(){
        return AjaxResult.success("小程序api调试成功！~");
    }

    @Autowired
    private IAbucoderWxuserService iAbucoderWxuserService;
    @Autowired
    private SysLoginService loginService;
    @Autowired
    private ServerConfig serverConfig;

    /**
     * 你自己的微信小程序APPID
     */

    private final static String AppID = "你自己的微信小程序APPID";
    /**
     * 你自己的微信APP密钥
     */
    private final static String AppSecret = "你自己的微信APP密钥";

    private static final Logger logger = LoggerFactory.getLogger(WxLoginController.class);
    /**
     * 登录时获取的 code（微信官方提供的临时凭证）
     * @return
     */
//    @PostMapping("/wxLogin")
//    public AjaxResult wxLogin(@RequestBody JSONObject object){
//        //微信官方提供的微信小程序登录授权时使用的URL地址
//        String url  = "https://api.weixin.qq.com/sns/jscode2session";
//        System.out.println(object);
//        /**
//         * 拼接需要的参数
//         * appid = AppID 你自己的微信小程序APPID
//         * js_code = AppSecret 你自己的微信APP密钥
//         * grant_type=authorization_code = code 微信官方提供的临时凭证
//         */
//        String params = StrUtil.format("appid={}&secret={}&js_code={}&grant_type=authorization_code", AppID, AppSecret, object.get("code"));
//        //开始发起网络请求,若依管理系统自带网络请求工具，直接使用即可
//        String res = HttpUtils.sendGet(url,params);
//        System.out.println("输出请求到的结果");
//        System.out.println(res);
//        JSONObject jsonObject = JSON.parseObject(res);
//        String session_key = (String) jsonObject.get("session_key");
//        String openid = (String) jsonObject.get("openid");
//        if (StrUtil.isEmpty(openid)) {
//            return AjaxResult.error("未获取到openid");
//        }
//        String token = UUID.randomUUID().toString();
//        Map<String, Object> data = new HashMap<>();
//        data.put("token", token);
//        data.put("session_key", session_key);
//        data.put("openid", openid);
//        data.put("state",true);
//        data.put("nickName",object.get("nickName"));
//        data.put("avatarUrl",object.get("avatarUrl"));
//        /**先通过openid来查询是否存在*/
//        AbucoderWxuser abucoderWxuser = iAbucoderWxuserService.selectAbucoderWxuserOpenID(openid);
//        if (abucoderWxuser == null){
//            /**如果不存在就插入到我们的数据库里*/
//            AbucoderWxuser  wxuser = new AbucoderWxuser();
//            wxuser.setNickname(String.valueOf(object.get("nickName")));
//            wxuser.setGender((Integer) object.get("gender"));
//            wxuser.setAvatar(String.valueOf(object.get("avatarUrl")));
//            wxuser.setOpenid(openid);
//            wxuser.setCreateTime(DateUtils.getNowDate());
//            wxuser.setCreateBy("Abu");
//            iAbucoderWxuserService.insertAbucoderWxuser(wxuser);
//        }else {
//            /**如果存在就更新数据库里原有的数据*/
//            abucoderWxuser.setNickname(String.valueOf(object.get("nickName")));
//            abucoderWxuser.setGender((Integer) object.get("gender"));
//            abucoderWxuser.setAvatar(String.valueOf(object.get("avatarUrl")));
//            abucoderWxuser.setUpdateTime(DateUtils.getNowDate());
//            abucoderWxuser.setUpdateBy("Abu");
//            iAbucoderWxuserService.updateAbucoderWxuser(abucoderWxuser);
//        }
//        /**返回结果集到前段*/
//        return AjaxResult.success(data);
//    }

    @PostMapping("/wxLogin")
    public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody)
    {
        logger.info("登录参数：" + JSON.toJSONString(wxLoginBody));
        String code = wxLoginBody.getCode();
        //秘钥
        String encryptedIv = wxLoginBody.getEncryptedIv();
        //加密数据
        String encryptedData = wxLoginBody.getEncryptedData();

        //想微信服务器发送请求获取用户信息
        String url  = "https://api.weixin.qq.com/sns/jscode2session";
        /**
         * 拼接需要的参数
         * appid = AppID 你自己的微信小程序APPID
         * js_code = AppSecret 你自己的微信APP密钥
         * grant_type=authorization_code = code 微信官方提供的临时凭证
         */
        String params = StrUtil.format("appid={}&secret={}&js_code={}&grant_type=authorization_code", AppID, AppSecret, code);
        //开始发起网络请求,若依管理系统自带网络请求工具，直接使用即可
        String res = HttpUtils.sendGet(url,params);
        System.out.println("输出请求到的结果");
        JSONObject jsonObject = JSONObject.parseObject(res);

        //获取session_key和openid
        String sessionKey = jsonObject.getString("session_key");
        String openid = jsonObject.getString("openid");
        //解密
        String decryptResult = "";
        try {
            //如果没有绑定微信开放平台，解析结果是没有unionid的。
            decryptResult = WxUtils.decrypt(sessionKey,encryptedIv,encryptedData);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("微信登录失败！");
        }

        if (StringUtils.hasText(decryptResult)){
            //如果解析成功,获取token
            String token = loginService.wxLogin(decryptResult);
            AjaxResult ajax = AjaxResult.success();
            ajax.put(Constants.TOKEN, token);
            return ajax;
        }else{
            return AjaxResult.error("微信登录失败！");
        }
    }


    @PostMapping("/upload")
    @ResponseBody
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        System.out.println(file);
        try
        {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = serverConfig.getUrl() + fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 保存昵称与头像信息到用户信息里
     * @param object
     * @return
     */
    @PostMapping("/saveUserInfo")
    @ResponseBody
    public AjaxResult saveUserInfo(@RequestBody JSONObject object){
        System.out.println(object);
        AbucoderWxuser abucoderWxuser = iAbucoderWxuserService.selectAbucoderWxuserOpenID(String.valueOf(object.get("openid")));
        if (StringUtils.hasLength(String.valueOf(object.get("nickName")))){
            abucoderWxuser.setNickname(String.valueOf(object.get("nickName")));
            abucoderWxuser.setCreateBy(String.valueOf(object.get("nickName")));
        }
        if (StringUtils.hasLength(String.valueOf(object.get("avatarUrl")))){
            abucoderWxuser.setAvatar(String.valueOf(object.get("avatarUrl")));
        }
        abucoderWxuser.setUpdateTime(DateUtils.getNowDate());
        iAbucoderWxuserService.updateAbucoderWxuser(abucoderWxuser);
        //返回前段需要的数据
        return AjaxResult.success(abucoderWxuser);
    }

}
